﻿using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Data.Odbc;
using WLMCoreLibrary;

using System.Xml;
using System.Xml.Serialization;
using System.ComponentModel;
using System.CodeDom.Compiler;
using System.Configuration;
using System.IO;
using System.Web;

namespace SAW_Core
{
    public class Compra : BaseClass
    {


        #region public properties
        public int idProveedor { get; set; }
        public String NombreCliente { get; set; }
        public String NombreComercialCliente { get; set; }
        public String RFCProveedor { get; set; }
        public String F_Calle { get; set; }
        public String F_NumeroExterior { get; set; }
        public String F_NumeroInterior { get; set; }
        public String F_Colonia { get; set; }
        public String F_Municipio { get; set; }
        public String F_Ciudad { get; set; }
        public String F_Estado { get; set; }
        public String F_CP { get; set; }
        public String Calle { get; set; }
        public String NumeroExterior { get; set; }
        public String NumeroInterior { get; set; }
        public String Colonia { get; set; }
        public String Ciudad { get; set; }
        public String Municipio { get; set; }
        public String Estado { get; set; }
        public String CP { get; set; }
        public DateTime FechaVencimiento { get; set; }
        public String TiempoEntrega { get; set; }
        public String CondicionesPago { get; set; }
        public String Observaciones { get; set; }
        public Decimal SubTotal { get; set; }
        public Decimal Descuento { get; set; }
        public Decimal DescuentoPorcentaje { get; set; }
        public Decimal IVA { get; set; }
        public Decimal Total { get; set; }
        public int idListaPrecios { get; set; }
        public int idCondicionesPago { get; set; }
        public Decimal SaldoPendiente { get; set; }
        public Decimal SaldoPagado { get; set; }
        public int Status { get; set; }
        public int NoPedido { get; set; }
        public int NoRemision { get; set; }
        public int NoSalida { get; set; }
        public DateTime FechaPedido { get; set; }
        public DateTime FechaRemision { get; set; }
        public DateTime FechaEntrada { get; set; }
public DateTime FechaSalida { get; set; }
        public int DiasCredito { get; set; }
        public int IdAlmacen { get; set; }
        public int idCotizacion { get; set; }
        public bool Activo { get; set; }
        public List<CompraItem> Conceptos { get; set; }
        #endregion

        #region constructors
        public Compra(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("COMPRAS");
            string queryString = "";
            queryString = "SELECT * FROM COMPRAS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public Compra(int registryId, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM COMPRAS WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
        }

        public Compra(int registryId, bool cargarTodo, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM COMPRAS WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
            Conceptos = new CompraItemCollection(this, ref ConexionDB).Elementos;
        }
        public Compra(DataRow dataRow, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods



        public void GenerarArchivoXML()
        {
            StringBuilder salida = new StringBuilder();
            Documento doc = new Documento();

            doc.CargarDatos(this, ref ConexionDBInterna);
            XmlSerializer serializer = new XmlSerializer(typeof(Documento));

            string rutaArchivos = "";
            string nombreArchivo = doc.NoDocumento.ToString("00000");

            rutaArchivos += "ComprasXML/" + doc.NoDocumento.ToString("00000") + "/";
            DirectoryInfo directorio = new DirectoryInfo(ConfigurationManager.AppSettings["sitePath"] + rutaArchivos);
            if (!directorio.Exists)
                directorio.Create();



            string archivo = ConfigurationManager.AppSettings["sitePath"] + rutaArchivos + nombreArchivo + ".xml";
            TextWriter tw = new StreamWriter(archivo);
            serializer.Serialize(tw, doc);
            tw.Close();
        }

        public int ConvertirAPedido()
        {
            if (Status == 1)
            {
                bool todoEnStock = true;
                Almacen almacen = new Almacen(IdAlmacen, ref ConexionDBInterna);
                //Verificando si todo el pedido se encuentra en Stock
                foreach (CompraItem item in Conceptos)
                {
                    Producto producto = new Producto(item.idProducto, ref ConexionDBInterna);
                    ProductoStock stock = new ProductoStock(producto, almacen, ref ConexionDBInterna);
                    if ((stock.Stock - producto.Apartados) < item.Cantidad)
                        todoEnStock = false;
                }
                int NoPedidoNuevo = 1;
                string consulta = "SELECT NoPedido FROM COMPRAS WHERE idAlmacen='" + IdAlmacen.ToString() + "'   ORDER BY NoPedido DESC LIMIT 1";
                OdbcDataReader lector = ConexionDBInterna.ExecuteReader(consulta);
                if (lector.HasRows)
                    NoPedidoNuevo = Convert.ToInt32(lector["NoPedido"]) + 1;



                //if (todoEnStock)
                {
                    Status = 2;
                    SaldoPendiente = Total;
                    NoPedido = NoPedidoNuevo;
                    FechaPedido = DateTime.Now;
                    Save();
                    Proveedor proveedor = new Proveedor(idProveedor, ref ConexionDBInterna);
                    proveedor.SaldoActual += Total;
                    proveedor.Save();
                    foreach (CompraItem item in Conceptos)
                    {
                        Producto producto = new Producto(item.idProducto, ref ConexionDBInterna);
                        ProductoStock stock = new ProductoStock(producto, almacen, ref ConexionDBInterna);
                        stock.porSurtir += item.Cantidad;
                        producto.UltimoPrecioCompra = item.Precio;
                        stock.Save();
                        producto.Save();
                        item.Status = 2;
                        item.Save();
                        ProductoAProveedor relacion = new ProductoAProveedor(producto, proveedor, ref ConexionDBInterna);
                        relacion.PrecioProveedor = item.Precio;
                        relacion.Save();
                    }
                    return NoPedidoNuevo;
                }
            }
            return 0;
        }

        public int GenerarEntradaAlmacen()
        {
            if (Status == 2)
            {
                try
                {
                    Almacen almacen = new Almacen(IdAlmacen, ref ConexionDBInterna);
                    int NoSalidaNuevo = 1;
                    string consulta = "SELECT NoSalida FROM COMPRAS WHERE idAlmacen='" + IdAlmacen.ToString() + "'   ORDER BY NoSalida DESC LIMIT 1";
                    OdbcDataReader lector = ConexionDBInterna.ExecuteReader(consulta);
                    if (lector.HasRows)
                        NoSalidaNuevo = Convert.ToInt32(lector["NoSalida"]) + 1;



                    Status = 4;
                    //SaldoPendiente = Total;
                    NoSalida = NoSalidaNuevo;
                    FechaEntrada = DateTime.Now;
                    Save();
                    foreach (CompraItem item in Conceptos)
                    {
                        Producto producto = new Producto(item.idProducto, ref ConexionDBInterna);
                        ProductoStock stock = new ProductoStock(producto, almacen, ref ConexionDBInterna);
                        stock.porSurtir -= item.Cantidad;
                        //if(producto.EsMateriaPrima)

                        MovimientoStock movimiento = new MovimientoStock(ref ConexionDBInterna);
                        movimiento.stockInicial = stock.Stock;
                        stock.Stock += item.Cantidad;
                        movimiento.stockFinal = stock.Stock;
                        movimiento.cantidadEntrada = item.Cantidad;
                        movimiento.idProducto = producto.id;
                        movimiento.idAlmacen = almacen.id;
                        movimiento.idCompra = id;
                        movimiento.fechaAplicacion = DateTime.Now;
                        movimiento.idProveedor = idProveedor;
                        movimiento.entrada = true;
                        movimiento.Save();


                        stock.Save();
                        item.Status = 3;
                        item.Save();
                    }
                    return NoSalidaNuevo;

                }
                catch (Exception ex)
                {
                    ErrorManagement.LogError(ex, HttpContext.Current);
                }
            }
            return 0;
        }

        public int GenerarRemision()
        {
            if (Status == 2)
            {
                bool todoEnStock = true;
                Almacen almacen = new Almacen(IdAlmacen, ref ConexionDBInterna);
                //Verificando si todo el pedido se encuentra en Stock
                foreach (CompraItem item in Conceptos)
                {
                    Producto producto = new Producto(item.idProducto, ref ConexionDBInterna);
                    ProductoStock stock = new ProductoStock(producto, almacen, ref ConexionDBInterna);
                    if ((stock.Stock - producto.Apartados) < item.Cantidad)
                        todoEnStock = false;
                }
                int NoRemisionNuevo = 1;
                string consulta = "SELECT NoRemision FROM COMPRAS WHERE idAlmacen='" + IdAlmacen.ToString() + "'   ORDER BY NoRemision DESC LIMIT 1";
                OdbcDataReader lector = ConexionDBInterna.ExecuteReader(consulta);
                if (lector.HasRows)
                    NoRemisionNuevo = Convert.ToInt32(lector["NoRemision"]) + 1;



                if (todoEnStock)
                {
                    Status = 3;

                    NoRemision = NoRemisionNuevo;
                    Save();

                    //foreach (CotizacionItem item in Conceptos)
                    //{
                    //    Producto producto = new Producto(item.idProducto,ref ConexionDB);
                    //    producto.Apartados += item.Cantidad;
                    //    producto.Save();
                    //    item.Status = 2;
                    //    item.Save();
                    //}
                    return NoRemisionNuevo;
                }
            }
            return 0;
        }

        public void Delete()
        {
            Activo = false;
            Save();

        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idProveedor")))
                    idProveedor = (System.Int32)reader["idProveedor"];
                if (!reader.IsDBNull(reader.GetOrdinal("NombreCliente")))
                    NombreCliente = (System.String)reader["NombreCliente"];
                if (!reader.IsDBNull(reader.GetOrdinal("NombreComercialCliente")))
                    NombreComercialCliente = (System.String)reader["NombreComercialCliente"];
                if (!reader.IsDBNull(reader.GetOrdinal("RFCProveedor")))
                    RFCProveedor = (System.String)reader["RFCProveedor"];
                if (!reader.IsDBNull(reader.GetOrdinal("F_Calle")))
                    F_Calle = (System.String)reader["F_Calle"];
                if (!reader.IsDBNull(reader.GetOrdinal("F_NumeroExterior")))
                    F_NumeroExterior = (System.String)reader["F_NumeroExterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("F_NumeroInterior")))
                    F_NumeroInterior = (System.String)reader["F_NumeroInterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("F_Colonia")))
                    F_Colonia = (System.String)reader["F_Colonia"];
                if (!reader.IsDBNull(reader.GetOrdinal("F_Municipio")))
                    F_Municipio = (System.String)reader["F_Municipio"];
                if (!reader.IsDBNull(reader.GetOrdinal("F_Ciudad")))
                    F_Ciudad = (System.String)reader["F_Ciudad"];
                if (!reader.IsDBNull(reader.GetOrdinal("F_Estado")))
                    F_Estado = (System.String)reader["F_Estado"];
                if (!reader.IsDBNull(reader.GetOrdinal("F_CP")))
                    F_CP = (System.String)reader["F_CP"];
                if (!reader.IsDBNull(reader.GetOrdinal("Calle")))
                    Calle = (System.String)reader["Calle"];
                if (!reader.IsDBNull(reader.GetOrdinal("NumeroExterior")))
                    NumeroExterior = (System.String)reader["NumeroExterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("NumeroInterior")))
                    NumeroInterior = (System.String)reader["NumeroInterior"];
                if (!reader.IsDBNull(reader.GetOrdinal("Colonia")))
                    Colonia = (System.String)reader["Colonia"];
                if (!reader.IsDBNull(reader.GetOrdinal("Ciudad")))
                    Ciudad = (System.String)reader["Ciudad"];
                if (!reader.IsDBNull(reader.GetOrdinal("Municipio")))
                    Municipio = (System.String)reader["Municipio"];
                if (!reader.IsDBNull(reader.GetOrdinal("Estado")))
                    Estado = (System.String)reader["Estado"];
                if (!reader.IsDBNull(reader.GetOrdinal("CP")))
                    CP = (System.String)reader["CP"];
                if (!reader.IsDBNull(reader.GetOrdinal("FechaVencimiento")))
                    FechaVencimiento = Convert.ToDateTime(reader["FechaVencimiento"]);
                if (!reader.IsDBNull(reader.GetOrdinal("TiempoEntrega")))
                    TiempoEntrega = (System.String)reader["TiempoEntrega"];
                if (!reader.IsDBNull(reader.GetOrdinal("CondicionesPago")))
                    CondicionesPago = (System.String)reader["CondicionesPago"];
                if (!reader.IsDBNull(reader.GetOrdinal("Observaciones")))
                    Observaciones = (System.String)reader["Observaciones"];
                if (!reader.IsDBNull(reader.GetOrdinal("SubTotal")))
                    SubTotal = (System.Decimal)reader["SubTotal"];
                if (!reader.IsDBNull(reader.GetOrdinal("Descuento")))
                    Descuento = (System.Decimal)reader["Descuento"];
                if (!reader.IsDBNull(reader.GetOrdinal("DescuentoPorcentaje")))
                    DescuentoPorcentaje = (System.Decimal)reader["DescuentoPorcentaje"];
                if (!reader.IsDBNull(reader.GetOrdinal("IVA")))
                    IVA = (System.Decimal)reader["IVA"];
                if (!reader.IsDBNull(reader.GetOrdinal("Total")))
                    Total = (System.Decimal)reader["Total"];
                if (!reader.IsDBNull(reader.GetOrdinal("idListaPrecios")))
                    idListaPrecios = (System.Int32)reader["idListaPrecios"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCondicionesPago")))
                    idCondicionesPago = (System.Int32)reader["idCondicionesPago"];
                if (!reader.IsDBNull(reader.GetOrdinal("SaldoPendiente")))
                    SaldoPendiente = (System.Decimal)reader["SaldoPendiente"];
                if (!reader.IsDBNull(reader.GetOrdinal("SaldoPagado")))
                    SaldoPagado = (System.Decimal)reader["SaldoPagado"];
                if (!reader.IsDBNull(reader.GetOrdinal("Status")))
                    Status = (System.Int32)reader["Status"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoPedido")))
                    NoPedido = (System.Int32)reader["NoPedido"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoRemision")))
                    NoRemision = (System.Int32)reader["NoRemision"];
                if (!reader.IsDBNull(reader.GetOrdinal("NoSalida")))
                    NoSalida = (System.Int32)reader["NoSalida"];
                if (!reader.IsDBNull(reader.GetOrdinal("FechaPedido")))
                    FechaPedido = Convert.ToDateTime(reader["FechaPedido"]);
                if (!reader.IsDBNull(reader.GetOrdinal("FechaRemision")))
                    FechaRemision = Convert.ToDateTime(reader["FechaRemision"]);
                if (!reader.IsDBNull(reader.GetOrdinal("FechaEntrada")))
                    FechaSalida = Convert.ToDateTime(reader["FechaEntrada"]);
                if (!reader.IsDBNull(reader.GetOrdinal("DiasCredito")))
                    DiasCredito = (System.Int32)reader["DiasCredito"];
                if (!reader.IsDBNull(reader.GetOrdinal("idAlmacen")))
                    IdAlmacen = (System.Int32)reader["idAlmacen"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCotizacion")))
                    idCotizacion = (System.Int32)reader["idCotizacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("activo")))
                    Activo = Convert.ToBoolean(reader["activo"]);
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idProveedor"] != null)
                    idProveedor = (System.Int32)dataRow["idProveedor"];
                if (dataRow["NombreCliente"] != null)
                    NombreCliente = (System.String)dataRow["NombreCliente"];
                if (dataRow["NombreComercialCliente"] != null)
                    NombreComercialCliente = (System.String)dataRow["NombreComercialCliente"];
                if (dataRow["RFCProveedor"] != null)
                    RFCProveedor = (System.String)dataRow["RFCProveedor"];
                if (dataRow["F_Calle"] != null)
                    F_Calle = (System.String)dataRow["F_Calle"];
                if (dataRow["F_NumeroExterior"] != null)
                    F_NumeroExterior = (System.String)dataRow["F_NumeroExterior"];
                if (dataRow["F_NumeroInterior"] != null)
                    F_NumeroInterior = (System.String)dataRow["F_NumeroInterior"];
                if (dataRow["F_Colonia"] != null)
                    F_Colonia = (System.String)dataRow["F_Colonia"];
                if (dataRow["F_Municipio"] != null)
                    F_Municipio = (System.String)dataRow["F_Municipio"];
                if (dataRow["F_Ciudad"] != null)
                    F_Ciudad = (System.String)dataRow["F_Ciudad"];
                if (dataRow["F_Estado"] != null)
                    F_Estado = (System.String)dataRow["F_Estado"];
                if (dataRow["F_CP"] != null)
                    F_CP = (System.String)dataRow["F_CP"];
                if (dataRow["Calle"] != null)
                    Calle = (System.String)dataRow["Calle"];
                if (dataRow["NumeroExterior"] != null)
                    NumeroExterior = (System.String)dataRow["NumeroExterior"];
                if (dataRow["NumeroInterior"] != null)
                    NumeroInterior = (System.String)dataRow["NumeroInterior"];
                if (dataRow["Colonia"] != null)
                    Colonia = (System.String)dataRow["Colonia"];
                if (dataRow["Ciudad"] != null)
                    Ciudad = (System.String)dataRow["Ciudad"];
                if (dataRow["Municipio"] != null)
                    Municipio = (System.String)dataRow["Municipio"];
                if (dataRow["Estado"] != null)
                    Estado = (System.String)dataRow["Estado"];
                if (dataRow["CP"] != null)
                    CP = (System.String)dataRow["CP"];
                if (dataRow["FechaVencimiento"] != null)
                    FechaVencimiento = (System.DateTime)dataRow["FechaVencimiento"];
                if (dataRow["TiempoEntrega"] != null)
                    TiempoEntrega = (System.String)dataRow["TiempoEntrega"];
                if (dataRow["CondicionesPago"] != null)
                    CondicionesPago = (System.String)dataRow["CondicionesPago"];
                if (dataRow["Observaciones"] != null)
                    Observaciones = (System.String)dataRow["Observaciones"];
                if (dataRow["SubTotal"] != null)
                    SubTotal = (System.Decimal)dataRow["SubTotal"];
                if (dataRow["Descuento"] != null)
                    Descuento = (System.Decimal)dataRow["Descuento"];
                if (dataRow["DescuentoPorcentaje"] != null)
                    DescuentoPorcentaje = (System.Decimal)dataRow["DescuentoPorcentaje"];
                if (dataRow["IVA"] != null)
                    IVA = (System.Decimal)dataRow["IVA"];
                if (dataRow["Total"] != null)
                    Total = (System.Decimal)dataRow["Total"];
                if (dataRow["idListaPrecios"] != null)
                    idListaPrecios = (System.Int32)dataRow["idListaPrecios"];
                if (dataRow["idCondicionesPago"] != null)
                    idCondicionesPago = (System.Int32)dataRow["idCondicionesPago"];
                if (dataRow["SaldoPendiente"] != null)
                    SaldoPendiente = (System.Decimal)dataRow["SaldoPendiente"];
                if (dataRow["SaldoPagado"] != null)
                    SaldoPagado = (System.Decimal)dataRow["SaldoPagado"];
                if (dataRow["Status"] != null)
                    Status = (System.Int32)dataRow["Status"];
                if (dataRow["NoPedido"] != null)
                    NoPedido = (System.Int32)dataRow["NoPedido"];
                if (dataRow["NoRemision"] != null)
                    NoRemision = (System.Int32)dataRow["NoRemision"];
                if (dataRow["NoSalida"] != null)
                    NoSalida = (System.Int32)dataRow["NoSalida"];
                if (dataRow["FechaPedido"] != null)
                    FechaPedido = (System.DateTime)dataRow["FechaPedido"];
                if (dataRow["FechaRemision"] != null)
                    FechaRemision = (System.DateTime)dataRow["FechaRemision"];
                if (dataRow["FechaEntrada"] != null)
                    FechaSalida = (System.DateTime)dataRow["FechaEntrada"];
                if (dataRow["DiasCredito"] != null)
                    DiasCredito = (System.Int32)dataRow["DiasCredito"];
                if (dataRow["idAlmacen"] != null)
                    IdAlmacen = (System.Int32)dataRow["idAlmacen"];
                if (dataRow["idCotizacion"] != null)
                    idCotizacion = (System.Int32)dataRow["idCotizacion"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE COMPRAS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idProveedor='" + this.idProveedor.ToString() + "'");
            strCommand.Append(",NombreCliente=\"" + WLMFunctions.comillas(NombreCliente) + "\"");
            strCommand.Append(",NombreComercialCliente=\"" + WLMFunctions.comillas(NombreComercialCliente) + "\"");
            strCommand.Append(",RFCProveedor=\"" + WLMFunctions.comillas(RFCProveedor) + "\"");
            strCommand.Append(",F_Calle=\"" + WLMFunctions.comillas(F_Calle) + "\"");
            strCommand.Append(",F_NumeroExterior=\"" + WLMFunctions.comillas(F_NumeroExterior) + "\"");
            strCommand.Append(",F_NumeroInterior=\"" + WLMFunctions.comillas(F_NumeroInterior) + "\"");
            strCommand.Append(",F_Colonia=\"" + WLMFunctions.comillas(F_Colonia) + "\"");
            strCommand.Append(",F_Municipio=\"" + WLMFunctions.comillas(F_Municipio) + "\"");
            strCommand.Append(",F_Ciudad=\"" + WLMFunctions.comillas(F_Ciudad) + "\"");
            strCommand.Append(",F_Estado=\"" + WLMFunctions.comillas(F_Estado) + "\"");
            strCommand.Append(",F_CP=\"" + WLMFunctions.comillas(F_CP) + "\"");
            strCommand.Append(",Calle=\"" + WLMFunctions.comillas(Calle) + "\"");
            strCommand.Append(",NumeroExterior=\"" + WLMFunctions.comillas(NumeroExterior) + "\"");
            strCommand.Append(",NumeroInterior=\"" + WLMFunctions.comillas(NumeroInterior) + "\"");
            strCommand.Append(",Colonia=\"" + WLMFunctions.comillas(Colonia) + "\"");
            strCommand.Append(",Ciudad=\"" + WLMFunctions.comillas(Ciudad) + "\"");
            strCommand.Append(",Municipio=\"" + WLMFunctions.comillas(Municipio) + "\"");
            strCommand.Append(",Estado=\"" + WLMFunctions.comillas(Estado) + "\"");
            strCommand.Append(",CP=\"" + WLMFunctions.comillas(CP) + "\"");
            strCommand.Append(",FechaVencimiento='" + FechaVencimiento.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",TiempoEntrega=\"" + WLMFunctions.comillas(TiempoEntrega) + "\"");
            strCommand.Append(",CondicionesPago=\"" + WLMFunctions.comillas(CondicionesPago) + "\"");
            strCommand.Append(",Observaciones=\"" + WLMFunctions.comillas(Observaciones) + "\"");
            strCommand.Append(",SubTotal=\"" + WLMFunctions.comillas(SubTotal) + "\"");
            strCommand.Append(",Descuento=\"" + WLMFunctions.comillas(Descuento) + "\"");
            strCommand.Append(",DescuentoPorcentaje=\"" + WLMFunctions.comillas(DescuentoPorcentaje) + "\"");
            strCommand.Append(",IVA=\"" + WLMFunctions.comillas(IVA) + "\"");
            strCommand.Append(",Total=\"" + WLMFunctions.comillas(Total) + "\"");
            strCommand.Append(",idListaPrecios='" + this.idListaPrecios.ToString() + "'");
            strCommand.Append(",idCondicionesPago='" + this.idCondicionesPago.ToString() + "'");
            strCommand.Append(",SaldoPendiente=\"" + WLMFunctions.comillas(SaldoPendiente) + "\"");
            strCommand.Append(",SaldoPagado=\"" + WLMFunctions.comillas(SaldoPagado) + "\"");
            strCommand.Append(",Status='" + Status.ToString() + "'");
            strCommand.Append(",NoPedido='" + NoPedido.ToString() + "'");
            strCommand.Append(",NoRemision='" + NoRemision.ToString() + "'");
            strCommand.Append(",NoSalida='" + NoSalida.ToString() + "'");
            if (FechaPedido != null)
                strCommand.Append(",FechaPedido='" + FechaPedido.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            if (FechaRemision != null)
                strCommand.Append(",FechaRemision='" + FechaRemision.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            if (FechaEntrada != null)
                strCommand.Append(",FechaEntrada='" + FechaSalida.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",DiasCredito='" + DiasCredito.ToString() + "'");
            strCommand.Append(",idAlmacen='" + IdAlmacen.ToString() + "'");
            strCommand.Append(",idCotizacion='" + idCotizacion.ToString() + "'");
            strCommand.Append(",activo='" + Convert.ToInt16(Activo) + "'");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class CompraCollection
    {

        public List<Compra> Elementos { get; set; }
        public CompraCollection()
        {
        }
        public CompraCollection(ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM COMPRAS ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<Compra>();
            while (dataReader.Read())
            {
                Compra newItem = new Compra(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public CompraCollection(Proveedor proveedor, ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM COMPRAS WHERE idProveedor='" + proveedor.id + "' ORDER BY ID DESC ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<Compra>();
            while (dataReader.Read())
            {
                Compra newItem = new Compra(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }

        public Compra UltimaCotizacion()
        {
            foreach (Compra cot in Elementos)
            {
                if (cot.Status == 1)
                    return cot;
            }
            return null;
        }

        public Compra UltimoPedido()
        {
            foreach (Compra cot in Elementos)
            {
                if (cot.Status > 1)
                    return cot;
            }
            return null;
        }
    }

    public class CompraItem : BaseClass
    {


        #region public properties
        public int idCompra { get; set; }
        public int idProducto { get; set; }
        public Decimal Cantidad { get; set; }
        public String Clave { get; set; }
        public String Descripcion { get; set; }
        public String Categoria { get; set; }
        public String Linea { get; set; }
        public String Marca { get; set; }
        public String Modelo { get; set; }
        public String Color { get; set; }
        public String Acabado { get; set; }
        public Decimal Precio { get; set; }
        public int Status { get; set; }
        #endregion

        #region constructors
        public CompraItem(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("COMPRASITEMS");
            string queryString = "";
            queryString = "SELECT * FROM COMPRASITEMS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public CompraItem(int registryId, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM COMPRASITEMS WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
        }
        public CompraItem(DataRow dataRow, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM COMPRASITEMS WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCompra")))
                    idCompra = (System.Int32)reader["idCompra"];
                if (!reader.IsDBNull(reader.GetOrdinal("idProducto")))
                    idProducto = (System.Int32)reader["idProducto"];
                if (!reader.IsDBNull(reader.GetOrdinal("Cantidad")))
                    Cantidad = (System.Decimal)reader["Cantidad"];
                if (!reader.IsDBNull(reader.GetOrdinal("Clave")))
                    Clave = (System.String)reader["Clave"];
                if (!reader.IsDBNull(reader.GetOrdinal("Descripcion")))
                    Descripcion = (System.String)reader["Descripcion"];
                if (!reader.IsDBNull(reader.GetOrdinal("Categoria")))
                    Categoria = (System.String)reader["Categoria"];
                if (!reader.IsDBNull(reader.GetOrdinal("Linea")))
                    Linea = (System.String)reader["Linea"];
                if (!reader.IsDBNull(reader.GetOrdinal("Marca")))
                    Marca = (System.String)reader["Marca"];
                if (!reader.IsDBNull(reader.GetOrdinal("Modelo")))
                    Modelo = (System.String)reader["Modelo"];
                if (!reader.IsDBNull(reader.GetOrdinal("Color")))
                    Color = (System.String)reader["Color"];
                if (!reader.IsDBNull(reader.GetOrdinal("Acabado")))
                    Acabado = (System.String)reader["Acabado"];
                if (!reader.IsDBNull(reader.GetOrdinal("Precio")))
                    Precio = (System.Decimal)reader["Precio"];
                if (!reader.IsDBNull(reader.GetOrdinal("Status")))
                    Status = (System.Int32)reader["Status"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idCompra"] != null)
                    idCompra = (System.Int32)dataRow["idCompra"];
                if (dataRow["idProducto"] != null)
                    idProducto = (System.Int32)dataRow["idProducto"];
                if (dataRow["Cantidad"] != null)
                    Cantidad = (System.Decimal)dataRow["Cantidad"];
                if (dataRow["Clave"] != null)
                    Clave = (System.String)dataRow["Clave"];
                if (dataRow["Descripcion"] != null)
                    Descripcion = (System.String)dataRow["Descripcion"];
                if (dataRow["Categoria"] != null)
                    Categoria = (System.String)dataRow["Categoria"];
                if (dataRow["Linea"] != null)
                    Linea = (System.String)dataRow["Linea"];
                if (dataRow["Marca"] != null)
                    Marca = (System.String)dataRow["Marca"];
                if (dataRow["Modelo"] != null)
                    Modelo = (System.String)dataRow["Modelo"];
                if (dataRow["Color"] != null)
                    Color = (System.String)dataRow["Color"];
                if (dataRow["Acabado"] != null)
                    Acabado = (System.String)dataRow["Acabado"];
                if (dataRow["Precio"] != null)
                    Precio = (System.Decimal)dataRow["Precio"];
                if (dataRow["Status"] != null)
                    Status = (System.Int32)dataRow["Status"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE COMPRASITEMS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idCompra='" + this.idCompra.ToString() + "'");
            strCommand.Append(",idProducto='" + this.idProducto.ToString() + "'");
            strCommand.Append(",Cantidad=\"" + WLMFunctions.comillas(Cantidad) + "\"");
            strCommand.Append(",Clave=\"" + WLMFunctions.comillas(Clave) + "\"");
            strCommand.Append(",Descripcion=\"" + WLMFunctions.comillas(Descripcion) + "\"");
            strCommand.Append(",Categoria=\"" + WLMFunctions.comillas(Categoria) + "\"");
            strCommand.Append(",Linea=\"" + WLMFunctions.comillas(Linea) + "\"");
            strCommand.Append(",Marca=\"" + WLMFunctions.comillas(Marca) + "\"");
            strCommand.Append(",Modelo=\"" + WLMFunctions.comillas(Modelo) + "\"");
            strCommand.Append(",Color=\"" + WLMFunctions.comillas(Color) + "\"");
            strCommand.Append(",Acabado=\"" + WLMFunctions.comillas(Acabado) + "\"");
            strCommand.Append(",Precio=\"" + WLMFunctions.comillas(Precio) + "\"");
            strCommand.Append(",Status='" + this.Status.ToString() + "'");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class CompraItemCollection
    {

        private List<CompraItem> _items;
        public List<CompraItem> Elementos { get; set; }
        public CompraItemCollection()
        {
        }
        public CompraItemCollection(ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM COMPRASITEMS ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<CompraItem>();
            while (dataReader.Read())
            {
                CompraItem newItem = new CompraItem(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }


        public CompraItemCollection(Compra compra, ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM COMPRASITEMS  WHERE idcompra='" + compra.id + "'";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<CompraItem>();
            while (dataReader.Read())
            {
                CompraItem newItem = new CompraItem(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }

    public class CompraPago : BaseClass
    {

        #region public properties
        public int idCompra { get; set; }
        public DateTime FechaRealizacion { get; set; }
        public int idMovimientoBancario { get; set; }
        public Decimal TotalPago { get; set; }
        public Decimal SaldoAntesPago { get; set; }
        public Decimal SaldoDespuesPago { get; set; }
        #endregion

        #region constructors
        public CompraPago(ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            WLMClassBinder classBinder = new WLMClassBinder(ref ConexionDB);
            id = classBinder.NewRecord("COMPRASPAGOS");
            string queryString = "";
            queryString = "SELECT * FROM COMPRASPAGOS WHERE id='" + this.id + "'";
            GetRecord(queryString);
        }

        public CompraPago(int registryId, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            string queryString = "";
            queryString = "SELECT * FROM COMPRASPAGOS WHERE id='" + registryId + "'";

            this.GetRecord(queryString);
        }
        public CompraPago(DataRow dataRow, ref dbConnector ConexionDB)
        {
            ConexionDBInterna = ConexionDB;
            this.GetRecord(dataRow);
        }
        #endregion

        #region public methods


        public void Delete()
        {
            string queryString = "";
            queryString = "DELETE FROM COMPRASPAGOS WHERE id='" + this.id + "'";
            ConexionDBInterna.ExecuteCommand(queryString);

        }
        #endregion


        #region Private Methods
        private void GetRecord(string queryString)
        {
            OdbcDataReader reader = ConexionDBInterna.ExecuteReader(queryString);
            if (reader.HasRows)
            {
                if (!reader.IsDBNull(reader.GetOrdinal("id")))
                    id = (System.Int32)reader["id"];
                if (!reader.IsDBNull(reader.GetOrdinal("fechaCreacion")))
                    fechaCreacion = Convert.ToDateTime(reader["fechaCreacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("fechaModificacion")))
                    fechaModificacion = Convert.ToDateTime(reader["fechaModificacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuario")))
                    idUsuario = (System.Int32)reader["idUsuario"];
                if (!reader.IsDBNull(reader.GetOrdinal("idUsuarioModificacion")))
                    idUsuarioModificacion = (System.Int32)reader["idUsuarioModificacion"];
                if (!reader.IsDBNull(reader.GetOrdinal("idCompra")))
                    idCompra = (System.Int32)reader["idCompra"];
                if (!reader.IsDBNull(reader.GetOrdinal("FechaRealizacion")))
                    FechaRealizacion = Convert.ToDateTime(reader["FechaRealizacion"]);
                if (!reader.IsDBNull(reader.GetOrdinal("idMovimientoBancario")))
                    idMovimientoBancario = (System.Int32)reader["idMovimientoBancario"];
                if (!reader.IsDBNull(reader.GetOrdinal("TotalPago")))
                    TotalPago = (System.Decimal)reader["TotalPago"];
                if (!reader.IsDBNull(reader.GetOrdinal("SaldoAntesPago")))
                    SaldoAntesPago = (System.Decimal)reader["SaldoAntesPago"];
                if (!reader.IsDBNull(reader.GetOrdinal("SaldoDespuesPago")))
                    SaldoDespuesPago = (System.Decimal)reader["SaldoDespuesPago"];
            }
        }


        private void GetRecord(DataRow dataRow)
        {
            if (dataRow != null)
            {
                if (dataRow["id"] != null)
                    id = (System.Int32)dataRow["id"];
                if (dataRow["fechaCreacion"] != null)
                    fechaCreacion = (System.DateTime)dataRow["fechaCreacion"];
                if (dataRow["fechaModificacion"] != null)
                    fechaModificacion = (System.DateTime)dataRow["fechaModificacion"];
                if (dataRow["idUsuario"] != null)
                    idUsuario = (System.Int32)dataRow["idUsuario"];
                if (dataRow["idUsuarioModificacion"] != null)
                    idUsuarioModificacion = (System.Int32)dataRow["idUsuarioModificacion"];
                if (dataRow["idCompra"] != null)
                    idCompra = (System.Int32)dataRow["idCompra"];
                if (dataRow["FechaRealizacion"] != null)
                    FechaRealizacion = (System.DateTime)dataRow["FechaRealizacion"];
                if (dataRow["idMovimientoBancario"] != null)
                    idMovimientoBancario = (System.Int32)dataRow["idMovimientoBancario"];
                if (dataRow["TotalPago"] != null)
                    TotalPago = (System.Decimal)dataRow["TotalPago"];
                if (dataRow["SaldoAntesPago"] != null)
                    SaldoAntesPago = (System.Decimal)dataRow["SaldoAntesPago"];
                if (dataRow["SaldoDespuesPago"] != null)
                    SaldoDespuesPago = (System.Decimal)dataRow["SaldoDespuesPago"];
            }
        }


        protected override void UpdateBind()
        {
            StringBuilder strCommand = new StringBuilder();
            strCommand.Append("UPDATE COMPRASPAGOS set ");
            strCommand.Append("fechaModificacion='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idUsuarioModificacion='" + this.idUsuarioModificacion.ToString() + "'");
            strCommand.Append(",idCompra='" + this.idCompra.ToString() + "'");
            strCommand.Append(",FechaRealizacion='" + this.FechaRealizacion.ToString("yyyy-MM-dd HH:mm:ss") + "'");
            strCommand.Append(",idMovimientoBancario='" + this.idMovimientoBancario.ToString() + "'");
            strCommand.Append(",TotalPago=\"" + WLMFunctions.comillas(TotalPago) + "\"");
            strCommand.Append(",SaldoAntesPago=\"" + WLMFunctions.comillas(SaldoAntesPago) + "\"");
            strCommand.Append(",SaldoDespuesPago=\"" + WLMFunctions.comillas(SaldoDespuesPago) + "\"");
            strCommand.Append(" WHERE id='" + this.id + "'");
            ConexionDBInterna.ExecuteCommand(strCommand.ToString());
        }
        #endregion
    }

    public class CompraPagoCollection
    {

        public List<CompraPago> Elementos { get; set; }
        public CompraPagoCollection()
        {
        }
        public CompraPagoCollection(ref dbConnector ConexionDB)
        {

            string strCommand = "SELECT id FROM COMPRASPAGOS ";
            OdbcDataReader dataReader = ConexionDB.ExecuteReader(strCommand);
            Elementos = new List<CompraPago>();
            while (dataReader.Read())
            {
                CompraPago newItem = new CompraPago(Convert.ToInt32(dataReader["id"]), ref ConexionDB);
                Elementos.Add(newItem);
            }
            dataReader.Close();
            dataReader.Dispose();
        }
    }
}
